﻿//创建时间: 2010-12-19
//创建作者: 李 城
//功能说明: 缓存 映射
//最后修改: 2011-1-24
using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Reflection;
using TRPOP.Common;
using TRPOP.Cache;

namespace TRPOP.CMS.Plugin
{
    /// <summary>
    /// 缓存操作映射
    /// </summary>
    public class ICacheAccess
    {
        public static ICache GetInstance()
        {
            return new TRPOP.Cache.CacheManage();
        }
    }
    /// <summary>
    /// 缓存操作方法
    /// </summary>
    public static class CacheHelper
    {
        #region 通用的方法

        /// <summary>
        /// 从缓存中读取数据 的委托方法
        /// </summary>
        /// <typeparam name="TCacheData"></typeparam>
        /// <param name="odata"></param>
        /// <returns></returns>
        public delegate bool CacheGetter<TCacheDataType>(out TCacheDataType odata);

        /// <summary>
        ///  获取信息(如果有缓存从缓存中获取)的通用方法
        /// </summary>
        /// <typeparam name="TCacheDataType"></typeparam>
        /// <param name="oGetCacheFromCache">从缓存库中获取缓存的方法</param>
        /// <param name="oGetCacheFromSource">从数据源获取缓存的方法</param>
        /// <param name="oSaveCache">保存缓存</param>
        /// <returns></returns>
        public static TCacheDataType Get<TCacheDataType>(
            string strCacheKey,//缓存Key
            CacheGetter<TCacheDataType> oGetCacheFromCacheContainer,//从缓存中读取数据
            Func<TCacheDataType> oGetCacheFromSource,//从数据源获取数据并返回
            Action<TCacheDataType> oSaveCache//保存数据
            )
        {
            TCacheDataType oCacheData;
            if (oGetCacheFromCacheContainer(out oCacheData))
            {
                return oCacheData;
            }
            oCacheData = oGetCacheFromSource();
            oSaveCache(oCacheData);
            return oCacheData;
        }

        #endregion

        /// <summary>
        /// 根据缓存接口定义的通用的缓存方法
        /// </summary>
        /// <typeparam name="TCacheDataType">缓存数据类型</typeparam>
        /// <param name="strCacheKey">缓存key</param>
        /// <param name="doubCacheTimeInterval">缓存时间</param>
        /// <param name="mICache">缓存操作方法</param>
        /// <param name="oGetCacheFromSource">从数据源获取缓存数据的方法</param>
        /// <returns>返回从缓存中获取的数据</returns>
        public static TCacheDataType GetByICache<TCacheDataType>(
            string strCacheKey,//缓存Key
            double doubCacheTimeInterval,//缓存保存的时间
            ICache mICache,//缓存操作接口
            Func<TCacheDataType> oGetCacheFromSource//从数据源获取数据并返回
            )
        {
            TCacheDataType oCacheData;
            /* 2011.07.28 之前的代码有点麻烦，可以换做下面的代码
             *  mICache.IsExist(strCacheKey) 和  mICache.Read(strCacheKey) 其实是重复的，判断读出的内容是否为空即可判断 IsExist
            if (mICache.IsExist(strCacheKey))
            {
                oCacheData = (TCacheDataType)(mICache.Read(strCacheKey));
                if (oCacheData == null)
                {
                    try
                    {
                        return (TCacheDataType)Activator.CreateInstance(oCacheData.GetType());
                    }
                    catch { }
                }
                return oCacheData;
            }
            */
            //2011.07.28 修改后的代码 begin
            oCacheData = (TCacheDataType)(mICache.Read(strCacheKey));
            if (oCacheData != null)
            {
                return oCacheData;
            }
            //2011.07.28 修改后的代码 end
            oCacheData = oGetCacheFromSource();
            mICache.Save(strCacheKey, oCacheData, doubCacheTimeInterval);
            return oCacheData;
        }
    }
}
